﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    internal class DemoReflection
    {

        
        public delegate void shuchu();//定义的委托
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="className">传入的类全名称</param>
        public void Demo(string className, string methodName)
        {
            Type type;                          // 存储类
            
            // 方式一
            type = Type.GetType(className);// 通过类名获取同名类
            
            //Object obj = Activator.CreateInstance(type);       // 创建实例
            
            Assembly assembly = Assembly.GetExecutingAssembly();// 获取当前程序集
            dynamic obj = assembly.CreateInstance(type.FullName);//动态创建当前类型的对象

            //根据传入的方法名获取当前类型的方法
            var method1 = type.GetMethod(methodName);
            //执行此方法，如果此方法有参数，则传入参数
            method1.Invoke(obj, null);// 调用方法，参数为空
            
            
            // 注意获取重载方法，需要指定参数类型
            // var method2 = type.GetMethod(methodName, new Type[] { typeof(string) });      // 获取方法信息
            // var parameters = new object[] {"hello"};
            // method2.Invoke(obj, parameters);                             // 调用方法，有参数
            //
            // var method3 = type.GetMethod(methodName, new Type[] { typeof(string), typeof(string) });      // 获取方法信息
            // parameters = new object[] { "hello", "你好" };
            // string result = (string)method3.Invoke(obj, parameters);     // 调用方法，有参数，有返回值
            // Console.WriteLine("Method 返回值：" + result);                // 输出返回值
 
            // 获取静态方法类名
            //string staticClassName = MethodBase.GetCurrentMethod().ReflectedType.FullName;
            //Console.WriteLine("当前静态方法类名：" + staticClassName);
            
            //两种方法动态赋值给委托。
            //Delegate myshuchu2 = mthof.CreateDelegate(typeof(shuchu), obj);
            //Delegate myshuchu1 = Delegate.CreateDelegate(typeof(shuchu), obj, mthof);
            //执行委托
            //myshuchu1.DynamicInvoke(null);
            //myshuchu2.DynamicInvoke(null);
        }
    }
    
    class Print 
    {
        // 无参数，无返回值方法
        public void Method()
        {
            Console.WriteLine("Method（无参数） 调用成功！");
        }
 
        // 有参数，无返回值方法
        public void Method(string str)
        {
            Console.WriteLine("Method（有参数） 调用成功！参数 ：" + str);
        }
 
        // 有参数，有返回值方法
        public string Method(string str1, string str2)
        {
            Console.WriteLine("Method（有参数，有返回值） 调用成功！参数 ：" + str1 + ", " + str2);
            string className = GetType().FullName;         // 非静态方法获取类名
            return className;
        }
    }
}
